#!/usr/bin/perl -w
use strict;
use WWW::Wikipedia;
use Data::Dumper;
use LWP::Simple;
use LWP::UserAgent;
use HTML::TreeBuilder;
use URI;


  #my $wiki = WWW::Wikipedia->new(language =>'es');

sub search_wiki {
  my $wiki = WWW::Wikipedia->new();
  my $ciudad = "@_";
  my $busqueda = $ciudad;
  ## search for 'perl' 
 
  my $result = $wiki->search( $ciudad );
  if ($result->fulltext() =~ /.REDIRECT:\s+(.*)/g) {
		$busqueda = $ciudad = $1;
		$result = $wiki->search( $ciudad );
  }
  my $texto;
  my $texto_final; #Salida de la búsqueda
  #print $result->fulltext();
  if ( $result->fulltext() ) { 
		$texto = $result->fulltext();
		if ($texto =~ /.[may]?\srefer\sto./g){
			#Busca algo para encontrar una ciudad española
			#print "$ciudad\n";
			$result->fulltext() =~ /(;?'?Spain'?:?'?\s*.?\*$ciudad,)(\s*\w*)/gs;
			#print "Refer $2\n";
			#print $result->fulltext();
			$busqueda = "$ciudad,".$2;
			#print "$busqueda\n";
			my $result1 = $wiki->search(  $busqueda );
			my @idiomas = $result1->languages();
			if (grep /es/, @idiomas) {
				my $result_es = $result1->language( 'es' );
				$texto_final = $result_es->fulltext();
			} else {
				$texto_final = $result1->fulltext();
			}
		} else {
			my @idiomas = $result->languages();
			if (grep /es/, @idiomas) {
				my $result_es = $result->language( 'es' );
				$texto_final = $result_es->fulltext();
			} else {
				$texto_final = $result->fulltext();
			}
        
			#print "**********************************************************************\n\n";
		}
		#print $result_es->fulltext();
		#print $result->headings(); #Diferentes apartados
		# print $result->raw();
  } else {
		$texto_final = undef; #No se encontró información
	}
	#Limpieza del texto
	#$texto_final =~ /({{Infobox[.]*)/gs;
	if (defined($texto_final)) {
		$texto_final =~ s/"//g;
		my @imagenes = get_images ($busqueda);
		my @links = enlaces ($texto_final);
		my $provincia = get_provincia ($texto_final);
		$texto_final = limpia($texto_final);
		my %salida = (links=> \@links, texto => $texto_final, prov => $provincia, imagen => \@imagenes);
		return %salida;
	}
	return undef;
}
############################################################################
# Elimina cuadros Infobox y dimilar                                        #
############################################################################
sub limpia {

my $texto = shift;
$texto =~ s/{{.*?}}//gs;
$texto =~ s/{.*?}//gs;
$texto =~ s/\[?\[.*?\]\]?//gs;
$texto =~ s/<.*?<\/\w+>//gs;

return $texto;
}
sub datos {

local $_ = shift;
my @salida;
#print "$_\n";
s/\s(\w*\s=)/#$1/g;
print "$_\n";
{
	#print "1\n";
        #print "$_\n";
        #if (m|\G#cod_provincia\s=\s(\d\d)|igcs){
	#	print "Casado2 : $1\n";
	#} elsif (m|\G#(\w+\s=\s\d+\.?,?\d*)|igcs) {
        #          print "Casado1 : $1\n";
	#	  #push @links, $1;
        if (m|\G#(.*\s=\s.)#|igcs) {
                  print "Casado : $1\n";
                  #push @links, $1;
	} elsif (m|\G(.?)|gcs) {
                #print "No Casa $1 \n";
	} else {
		return @salida;
	}
	redo;
}
}
############################################################################
# Función que tiene como objetivo devolver la provincia a la que pertenece #
############################################################################
sub get_provincia {
my $texto = shift;
my %provincias =(1=> "Alava",
2 => "Albacete",
3 => "Alicante",
4 => "Almeria",
5 => "Avila",
6 => "Badajoz",
7 => "Baleares",
8 => "Barcelona",
9 => "Burgos",
10 => "Caceres",
11 => "Cadiz",
12 => "Castellon",
13 => "Ciudad Real",
14 => "Cordoba",
15 => "La Coruña",
16 => "Cuenca",
17 => "Gerona",
18 => "Granada",
19 => "Guadalajara",
20 => "Guipuzcoa",
21 => "Huelva",
22 => "Huesca",
23 => "Jaen",
24 => "Leon",
25 => "Lerida",
26 => "La Rioja",	
27 => "Lugo",
28 => "Madrid",
29 => "Malaga",
30 => "Murcia",
31 => "Navarra",
32 => "Orense",
33 => "Asturias",
34 => "Palencia",
35 => "Las Palmas",
36 => "Pontevedra",
37 => "Salamanca",
38 => "Santa Cruz Tenerife",
39 => "Cantabria",	
40 => "Segovia",
41 => "Sevilla",
42 => "Soria",
43 => "Tarragona",
44 => "Teruel",
45 => "Toledo",
46 => "Valencia",
47 => "Valladolid",
48 => "Vizcaya",
49 => "Zamora",
50 => "Zaragoza",
51 => "Ceuta",
52 => "Melilla");

if ($texto =~ /cod_provincia\s=\s(\d\d)/gcs) {
	return $provincias{$1};
} else {
	return undef;
}
}
############################################################################
# Función que tiene como objetivo devolver todos los enlaces de la entrada #
# la wikipedia                                                             #
############################################################################
sub enlaces {
local $_ = shift;
my @links;
	{
		#print "1\n";
                #print "$_\n";
		if (m|\G(http://.*\.\w+\s+)\S|igc) {
                        #print "Casado : $1\n";
			push @links, $1;
		} elsif (m|\G(.?)|gcs) {
                        #print "$1 2\n";
		} else {
			return @links;
		}
		redo;
	}

}

#############################################################################
# Esta función devolverá un array con las imágnes descargadas de una ciudad #
# mediante la wikipedia							    #
#############################################################################
sub get_images {

	my $ciudad = shift or die "No se ha pasado una ciudad\n";
        my $base ='http://en.wikipedia.org/wiki/';
        my $ua = LWP::UserAgent->new;
	$ua->agent('Mozilla/5.0');
        #URL en forma canonica   
	my $url = URI->new($base.$ciudad)->canonical;
        my ($fn)="$url" =~ /^.*\/(.*?)$/;
        my $response = $ua->get($url->as_string);

        if ($response->is_success) {
     		#print $response->content;  # or whatever
		my @imagenes;
		my $tree = HTML::TreeBuilder->new_from_content($response->content);
		my @links = $tree->find_by_tag_name('img');
                #print Dumper(@links),"\n";
		#print Dumper($links[0]), "\n";
                @links = map { $_->attr("src") } @links;
		my $cont = 0;
		foreach (@links) {

			if (/http/) {
			    if (!(/svg/)) {
				my $temp = $_;
				$temp =~/.*\.(\w+)/i;
				my $imagen = $ciudad.$cont.".".$1;
				$cont++;
				$temp =~ s/thumb\///g; #Para descargar imagenes grandes
				
			$ua->get( $temp , ':content_file' => $imagen);
				push @imagenes, $imagen;
			    }
			}
		}
		return @imagenes;
 	}
 	else {
     		#die $response->status_line;
		return undef;
 	}
}
my %salida = search_wiki ("@ARGV");
#my @try = $salida->[0];

print "$salida{texto} \n";
#print "$salida{prov} \n";
#print "@{$salida{imagen}}";
  ## list any related items we can look up 
  #print join( "\n", $result->related() );
  #print join( "\n", $result->languages() );
###############################################
#TODO Limpiar la Salida
#mejorar la detección de opciones para algunas ciudades, por 
#problemas de la Wikipedia
1;